// 引入axios
import axios from 'axios'
//  引入store
import store from '../store'

// 实现请求拦截，封装固定参数
const Axios = axios.create({
    timeout: 5000,
    baseURL: '/apis'
})

// 发起请求之前拦截
// 请求前的拦截，需要返回数据config，才会继续发出请求
Axios.interceptors.request.use(function(config) {
    // 如果token不存在，直接抛出一个错误，然后借宿请求
    // let token = this.$store. 因为这个不是vue组件，所以this没有$store对象，所以要引入store实例
    // 那么所有非要拦截的接口，都应该在请求前就要保证vuex中有一个token数据
    let token = store.getters['common/getToken']
        // 对所有接口进行拦截。不是所有的接口都需要拦截
        //则需要对请求地址进行过滤，
        //定义一个数组，然后把所有的不需要拦截地址在这里进行定义
    let otherPath = ['/user/app/code', '/user/app/login', '/user/app/register']
        // 如果请求地址包含在其中，那么这个请求就不需要拦截
    if (otherPath.includes(config.url)) {
        return config
    } else {
        // 如果需要拦截，则需要对token进行校验
        // 如果不存在，直接返回一个错误信息
        if (!token) {
            return Promise.reject({ code: 400, message: '当前用户没有登录，所以不能发出异步请求' })
        } else {
            // 可以对config数据进行加工，添加上token数据
            config.headers.token = token
                // 直接发出请求
            return config
        }
    }
})

// 请求之后拦截
// use 需要传递一个函数，这个函数要求返回一个Promise或则是一个对象(Promise | any)
// 函数会有一个响应对象形参，然后可以通过对形参的data对象处理，实现通用业务的一个拦截处理
Axios.interceptors.response.use(function(response) {
    if (response.data.code === 403) {
        return Promise.reject('用户的token错误或已失效，需要用户重新登录获取新的token')
    } else {
        return response
    }
})

// 封装一个ajax请求方法
function ajaxFunc(req) {

    // 如果url地址没有传递，直接报错 --js是主线程运行应用，所以可以使用异常抛出中断当前的线程
    if (!req.url) {
        throw new SyntaxError('请求的url参数是必传的')
    }
    // 当传递url地址再进行下面的操作
    return new Promise(resolve => {
        // axios.request({
        Axios.request({
            // 设置请求地址
            url: req.url,
            method: req.method || 'GET',
            // 所有的请求都加上一个/apis，然后服务器会把它进行一个代理
            // baseURL: '/apis',
            // 请求头
            headers: { token: 'test token' },
            // 设置请求超时
            // timeout: 5000,
            // params参数配置 -- 它的参数会自动拼接到ulr地址上
            params: req.params || {},
            // data参数 --不能在get请求中使用，它是请求体参数
            data: req.data || {}
        }).then(({ data }) => {
            resolve(data)
        }).catch(e => {
            console.log('-----请求失败');
            resolve(e)
        })
    })
}


export default ajaxFunc